#ifndef SLIDESWITCH_H
#define SLIDESWITCH_H

#include <QWidget>

/**
 * @brief   滑动开关控件
 * @details 一个自定义的实用性滑动开关，其功能如下：\n
 * -# 可设置背景颜色和滑块背景色；
 * -# 可设置是否显示提示光以及提示光颜色。
 * -# 可以设置圆角半径；
 * -# 可设置是否开启动画；
 * -# 可设置动画效果的速度；
 */
class SlideSwitch : public QWidget
{
    Q_OBJECT

    Q_PROPERTY(bool isChecked READ getIsChecked WRITE setChecked)
    Q_PROPERTY(bool isAnimated READ getIsAnimated WRITE setAnimated)
    Q_PROPERTY(bool isShowTip READ getIsShowTip WRITE setShowTip)
    Q_PROPERTY(QColor bgColor READ getBgColor WRITE setBgColor)
    Q_PROPERTY(QColor sliderColor READ getSliderColor WRITE setSliderColor)
    Q_PROPERTY(QColor tipLightColor READ getTipLightColor WRITE setTipLightColor)
    Q_PROPERTY(QColor tipLightCheckColor READ getTipLightCheckColor WRITE setTipLightCheckColor)
    Q_PROPERTY(qreal radius READ getRadius WRITE setRadius)
    Q_PROPERTY(int animationInterval READ getAnimationInterval WRITE setAnimationInterval)

public:
    explicit SlideSwitch(QWidget *parent = 0);
    ~SlideSwitch() override;

    // Setter functions
    /// 设置是否选中
    void setChecked(bool checked);
    /// 设置是否显示提示光
    void setShowTip(bool showTip);
    /// 设置背景色
    void setBgColor(const QColor &color);
    /// 设置滑块颜色
    void setSliderColor(const QColor &color);
    /// 设置提示光颜色
    void setTipLightColor(const QColor &color);
    /// 设置提示光选中颜色
    void setTipLightCheckColor(const QColor &color);
    /// 设置圆弧半径
    void setRadius(qreal radius);
    /// 设置是否开启动画
    void setAnimated(bool animated);
    /// 设置动画速度（毫秒）
    void setAnimationInterval(int interval);

    // Getter functions
    /// 获取是否选中
    bool getIsChecked() const { return m_isChecked; }
    /// 获取是否开启动画
    bool getIsAnimated() const { return m_isAnimated; }
    /// 获取是否显示提示光
    bool getIsShowTip() const { return m_isShowTip; }
    /// 获取背景色
    QColor getBgColor() const { return m_bgColor; }
    /// 获取滑块颜色
    QColor getSliderColor() const { return m_sliderColor; }
    /// 获取提示光颜色
    QColor getTipLightColor() const { return m_tipLightColor; }
    /// 获取提示光选中颜色
    QColor getTipLightCheckColor() const { return m_tipLightCheckColor; }
    /// 获取圆弧半径
    qreal getRadius() const { return m_radius; }
    /// 获取动画速度（毫秒）
    int getAnimationInterval() const { return m_interval; }

protected:
    void paintEvent(QPaintEvent *event) override;
    void mousePressEvent(QMouseEvent *event) override;
    void mouseMoveEvent(QMouseEvent *event) override;
    void mouseReleaseEvent(QMouseEvent *event) override;

    void animateTimer();

signals:
    void checkedChanged(bool checked);

private:
    void drawBg(QPainter *painter);
    void drawSlider(QPainter *painter);
    void drawTipLight(QPainter *painter);

private:
    bool m_isAnimated;  ///< 是否开启动画
    bool m_isShowTip;   ///< 是否显示提示光

    bool m_isPressed;     ///< 是否按下
    bool m_isCanChecked;  ///< 是否可以选中
    bool m_isChecked;     ///< 是否选中

    QColor m_bgColor;               ///< 背景颜色
    QColor m_sliderColor;           ///< 滑块颜色
    QColor m_tipLightColor;         ///< 提示光颜色
    QColor m_tipLightCheckColor;    ///< 提示光选中颜色
    QColor m_tipLightCurrentColor;  ///< 提示光当前颜色

    qreal m_radius;  ///< 圆弧半径

    int m_interval;   ///< 间隔
    QTimer *m_timer;  ///< 动画定时器

    int m_sliderX;  ///< 滑块X坐标
    int m_step;     ///< 步长
};

#endif  // SLIDESWITCH_H
